﻿namespace Beetle.Web
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Web;

    /// <summary>
    /// 自定义资源处理工厂,当请求Beetle.axd时,为启用此类处理.
    /// </summary>
    /// <!-- 作者:韦腾  时间:2010年02月09日 -->
    /// <remarks>必须在Web.Config里配置基础控件自定义处理httpHandler.基础控件所有资源都从Beetle.axd获取.请参见示例.</remarks>
    /// <example>
    /// 请在 Web.config httpHandlers 节点配置如下节点:
    /// <code lang="XML">
    /// <![CDATA[ 
    /// <httpHandlers>
    ///      <add path="*/Beetle.axd" verb="*" type="Beetle.Web.HandlerFactory" validate="false" />
    /// <httpHandlers>
    /// ]]>
    /// </code>
    /// </example>
    public class HandlerFactory : IHttpHandlerFactory
    {
        #region IHttpHandlerFactory 成员
        /// <summary>
        /// 根据URL参数,返回实现 IHttpHandler 接口的类的实例。
        /// </summary>
        /// <param name="context"><see cref="HttpContext"/>  类的实例，它提供对用于为 HTTP 请求提供服务的内部服务器对象(如 Request、Response、Session 和 Server)的引用.</param>
        /// <param name="requestType">客户端使用的 HTTP 数据传输方法(GET 或 POST).</param>
        /// <param name="url">所请求资源的 <see cref="RawUrl"/></param>
        /// <param name="pathTranslated">所请求资源的 <see cref="PhysicalApplicationPath"/> </param>
        /// <returns type="IHttpHandler">处理请求的新的<see cref="System.Web.IHttpHandler"/> 对象。 </returns>
        public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated)
        {
            string type = context.Request["type"];

            if (!string.IsNullOrEmpty(type))
            {
                switch (type.ToLower())
                {
                    case "r":
                        return new Beetle.Web.ResourceManager(); ////取资源                   
                    default:
                        throw new Exception("找不到相应的处理标记:" + type);
                }
            }
            else
            {
                if (string.IsNullOrEmpty(context.Request.Url.Query))
                {
                    throw new Exception("处理标记不能为空.");
                }
                else
                {
                    return new Beetle.Web.ResourceManager();
                }
            }
        }

        /// <summary>
        /// 使工厂可以重用现有的处理程序实例。
        /// </summary>
        /// <param name="handler">要重用的 <see cref="IHttpHandler"/> 对象。</param>
        public void ReleaseHandler(IHttpHandler handler)
        {
            ////throw new NotImplementedException();
        }
        #endregion
    }
}
